#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,m,K;
const int N=22;
int mp[N][N];
int ans[N];
int dp[1<<22][22];
int main()
{
    scanf("%d%d%d",&n,&m,&K);
    while(m--)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        mp[u][v]=mp[v][u]=true;
    }
    for(int i=1;i<=n;i++) //枚举那些边是起点
    {
        dp[1<<(i-1)][i]=1;
    }

    for(int i=1;i<=(1<<n)-1;i++) //(1<<n)-1是最后一个状态，即所有点都走过
    {
        int s = __builtin_ffs(i);    //求i最后一个1的位置，作为起点
        for(int j=1;j<=n;j++) if(i&(1<<(j-1))){    //枚举当前点
                int len=__builtin_popcount(i);
                if(len>=3){
                    if(mp[j][s])    //如果首尾相连，成环
                    {
                        ans[len%K]=(ans[len%K]+dp[i][j])%mod;
                    }
                }

                for(int k=s+1;k<=n;k++) {    //枚举下一个点，不枚举起点前面的点，不重不漏
                    int kk=1<<(k-1);
                    if(i&kk) continue;
                    if(mp[j][k])
                    {
                        dp[i|kk][k]=(dp[i|kk][k]+dp[i][j])%mod;
                    }
                }

            }
    }
    for(int i=0;i<K;i++)
        printf("%d\n",(1ll*ans[i]*(mod+1)/2)%mod);    //乘2的逆元(mod+1)/2
}